home *** CD-ROM | disk | FTP | other *** search
/ EnigmA Amiga Run 1995 October / EnigmA AMIGA RUN 01 (1995)(G.R. Edizioni)(IT)[!][issue 1995-10][Aminet 7].iso / Aminet / mus / play / tracker_4_31.lzh / tracker / OS2 / ui.c
Text File  |  1995-05-15  |  8KB  |  418 lines

  1. /* os2/ui.c
  2.     vi:ts=3 sw=3:
  3.  */
  4.  
  5. /* Set terminal discipline to non blocking io and such.
  6.  */
  7. /* $Id: ui.c,v 1.1 1995/05/15 13:16:57 espie Exp espie $
  8.  * $Log: ui.c,v $
  9.  * Revision 1.1  1995/05/15  13:16:57  espie
  10.  * Initial revision
  11.  *
  12.  * Revision 4.13  1995/05/11  12:05:05  espie
  13.  * Old code trimmed away.
  14.  *
  15.  * Revision 4.12  1995/03/17  00:32:53  espie
  16.  * PREF XTERM code.
  17.  *
  18.  * Revision 4.11  1995/03/11  23:06:51  espie
  19.  * Display everything in titlebars for xterms.
  20.  *
  21.  * Revision 4.10  1995/03/06  23:36:30  espie
  22.  * Proper color patch.
  23.  *
  24.  * Revision 4.9  1995/03/03  14:24:40  espie
  25.  * Color fixed.
  26.  *
  27.  * Revision 4.8  1995/02/27  14:26:34  espie
  28.  * Cleaned up by Rolf Grossmann.
  29.  *
  30.  * Revision 4.7  1995/02/26  23:08:55  espie
  31.  * POSIX_CONFORMANT.
  32.  *
  33.  * Revision 4.6  1995/02/24  15:40:38  espie
  34.  * Removed all dependencies from show (cached PREF_SHOW) and
  35.  * fixed a small display bug therefore.
  36.  *
  37.  * Revision 4.5  1995/02/21  17:59:26  espie
  38.  * Internal problem: bad log with rcs.
  39.  *
  40.  * Revision 4.4  1995/02/08  13:47:35  espie
  41.  * *** empty log message ***
  42.  *
  43.  * Revision 4.3  1995/01/28  09:56:53  espie
  44.  * Port to FreeBSD/NeXTstep.
  45.  *
  46.  * Revision 4.2  1995/01/28  09:23:38  espie
  47.  * Support for old bsd io discipline (NeXT)
  48.  *
  49.  *
  50.  * Revision 4.0  1994/01/11  18:02:31  espie
  51.  * Major change: lots of new calls.
  52.  * Stupid termio bug: shouldn't restore term to sanity if we don't
  53.  * know what sanity is. For instance, if we haven't modified anything.
  54.  * cflags interpreted correctly.
  55.  * Hsavolai fix.
  56.  * Added bg/fg test.
  57.  */
  58.  
  59.  
  60. #include <os2.h>
  61. #include <termios.h>
  62. #include <signal.h>
  63.  
  64. #include "defs.h"
  65. #include "extern.h"
  66. #include "tags.h"
  67. #include "prefs.h"
  68.  
  69. extern char *VERSION;
  70.  
  71. LOCAL void nonblocking_io P((void));
  72. LOCAL void sane_tty P((void));
  73.  
  74. LOCAL void (*INIT)P((void)) = nonblocking_io;
  75.  
  76. /* poor man's timer */
  77. LOCAL int current_pattern;
  78. LOCAL int count_pattern, count_song;
  79. #define SMALL_DELAY 25
  80.  
  81. LOCAL struct termios sanity;
  82. LOCAL struct termios *psanity = 0;
  83.  
  84. LOCAL int is_fg;
  85.  
  86. /* signal handler */
  87.  
  88. LOCAL void goodbye(sig)
  89. int sig;
  90.    {
  91.    static char buffer[25];
  92.     char *pter = buffer;
  93.  
  94.     if (get_pref_scalar(PREF_COLOR))
  95.         pter = write_color(pter, 0);
  96.     sprintf(pter, "Signal %d", sig);
  97.    end_all(pter);
  98.    }
  99.  
  100. LOCAL void abort_this(sig)
  101. int sig;
  102.    {
  103.    end_all("Abort");
  104.    }
  105.  
  106. #ifdef SIGTSTP
  107. LOCAL void suspend(sig)
  108. int sig;
  109.    {
  110.     static char buffer[25];
  111.     char *buf = buffer;
  112.     
  113.     if (get_pref_scalar(PREF_COLOR))
  114.         buf = write_color(buf, 0);
  115.     *buf = 0;
  116.     puts(buf);
  117.    fflush(stdout);
  118.    sane_tty();
  119.    signal(SIGTSTP, SIG_DFL);
  120.    kill(0, SIGTSTP);
  121.    }
  122. #endif
  123.  
  124. int run_in_fg()
  125.    {
  126.    USHORT          Indicator;
  127.    return(VioGetAnsi(&Indicator,0)==0);
  128.    }
  129.  
  130. /* if_fg_sane_tty():
  131.  * restore tty modes, _only_ if running in foreground
  132.  */
  133. LOCAL void if_fg_sane_tty()
  134.     {
  135.     if (run_in_fg())
  136.         sane_tty();
  137.     }
  138.  
  139.  
  140. LOCAL void switch_mode()
  141.    {
  142.    struct termios zap;
  143.  
  144. #ifdef SIGTSTP
  145.    signal(SIGTSTP, suspend);
  146. #endif
  147.    signal(SIGINT, goodbye);
  148.    signal(SIGQUIT, goodbye);
  149.    signal(SIGUSR1, abort_this);
  150.  
  151.    if (run_in_fg())
  152.       {
  153.       tcgetattr(fileno(stdin), &zap);
  154.       zap.c_cc[VMIN] = 0;
  155.       zap.c_cc[VTIME] = 0;
  156.       zap.c_lflag &= ~(ICANON|ECHO|ECHONL);
  157.       tcsetattr(fileno(stdin), TCSADRAIN, &zap);
  158.       is_fg = TRUE;
  159.       }
  160.    else
  161.       is_fg = FALSE;
  162.    }
  163.  
  164. /* nonblocking_io():
  165.  * try to setup the keyboard to non blocking io
  166.  */
  167. LOCAL void nonblocking_io()
  168.    {
  169.    if (!psanity)
  170.       {
  171.       psanity = &sanity;
  172.       tcgetattr(fileno(stdin), psanity);
  173.       }
  174.    switch_mode();
  175.    at_end(if_fg_sane_tty);
  176.    }
  177.  
  178.  
  179. /* sane_tty():
  180.  * restores everything to a sane state before returning to shell */
  181. LOCAL void sane_tty()
  182.    {
  183.       tcsetattr(fileno(stdin), TCSADRAIN, psanity);
  184.    }
  185.  
  186. LOCAL int may_getchar()
  187.    {
  188.    int ch;
  189.  
  190.    if((ch = _read_kbd(0,0,0)) == 0);
  191.        {
  192.        ch = _read_kbd(0,0,0);
  193.        ch = -1;
  194.        }
  195.    return((ch<0?EOF:ch));
  196.    }
  197.  
  198. LOCAL struct tag result[2];
  199.  
  200. struct tag *get_ui()
  201.    {
  202.    result[0].type = TAG_END;
  203.    result[1].type = TAG_END;
  204.    count_pattern++;
  205.    count_song++;
  206.    switch(may_getchar())
  207.       {
  208.    case 'n':
  209.       result[0].type = UI_NEXT_SONG;
  210.       break;
  211.    case 'p':
  212.       if (count_song > SMALL_DELAY)
  213.          result[0].type = UI_RESTART;
  214.       else
  215.          result[0].type = UI_PREVIOUS_SONG;
  216.       count_song = 0;
  217.       break;
  218.    case 'x':
  219.    case 'e':
  220.    case 'q':
  221.       result[0].type = UI_QUIT;
  222.       break;
  223.    case 's':
  224.       result[0].type = UI_SET_BPM;
  225.       result[0].data.scalar = 50;
  226.       break;
  227.    case 'S':
  228.       result[0].type = UI_SET_BPM;
  229.       result[0].data.scalar = 60;
  230.       break;
  231.    case '>':
  232.       result[0].type = UI_JUMP_TO_PATTERN;
  233.       result[0].data.scalar = current_pattern + 1;
  234.       break;
  235.    case '<':
  236.       result[0].type = UI_JUMP_TO_PATTERN;
  237.       result[0].data.scalar = current_pattern;
  238.       if (count_pattern < SMALL_DELAY)
  239.          result[0].data.scalar--;
  240.       break;
  241.    case '?':
  242.       set_pref_scalar(PREF_SHOW, !get_pref_scalar(PREF_SHOW));
  243.       if(get_pref_scalar(PREF_SHOW))
  244.          putchar('\n');
  245.       break;
  246.    default:
  247.       break;
  248.       }
  249.    return result;
  250.    }
  251.  
  252. void notice(s)
  253. char *s;
  254.    {
  255.    fprintf(stderr, "%s\n", s);
  256.    }
  257.  
  258. void status(s)
  259. char *s;
  260.    {
  261.    if (run_in_fg())
  262.       {
  263.         if (s)
  264.          {
  265.          puts(s);
  266.          }
  267.       else
  268.          putchar('\n');
  269.       }
  270.    }
  271.  
  272. LOCAL char title[25];
  273. void song_title(s)
  274. char *s;
  275.    {
  276.     strncpy(title, s, 25);
  277.    count_song = 0;
  278.    }
  279.  
  280.  
  281. LOCAL char scroll_buffer[200];
  282.  
  283. GENERIC begin_info(title)
  284. char *title;
  285.    {
  286.    if (run_in_fg())
  287.       return scroll_buffer;
  288.    else
  289.       return 0;
  290.    }
  291.  
  292. void infos(handle, s)
  293. GENERIC handle;
  294. char *s;
  295.    {
  296.    if (handle)
  297.       printf(s);
  298.    }
  299.  
  300. void info(handle, line)
  301. GENERIC handle;
  302. char *line;
  303.    {
  304.    if (handle)
  305.       puts(line);
  306.    }
  307.  
  308. void end_info(handle)
  309. GENERIC handle;
  310.    {
  311.    if (handle)
  312.       fflush(stdout);
  313.    }
  314.  
  315. LOCAL char *last_result = 0;
  316.  
  317. LOCAL int ntracks;
  318.  
  319. void set_number_tracks(n)
  320. int n;
  321.     {
  322.     ntracks = n;
  323.     }
  324.  
  325. char *new_scroll()
  326.    {
  327.    if (run_in_fg())
  328.       {
  329.         char *temp;
  330.         int i;
  331.  
  332.       last_result = scroll_buffer;
  333.         temp = last_result;
  334.         if (get_pref_scalar(PREF_COLOR))
  335.             {
  336.             for (i = 0; i * 2 < ntracks; i++)
  337.                 {
  338.                 strcpy(temp, "                    ");
  339.                 temp = write_color(temp + 20, 0);
  340.                 *temp++ = '|';
  341.                 }
  342.             *temp++ = '|';
  343.             for (i = 0; i * 2 < ntracks; i++)
  344.                 {
  345.                 strcpy(temp, "                    ");
  346.                 temp = write_color(temp + 20, 0);
  347.                 *temp++ = '|';
  348.                 }
  349.             }
  350.         else
  351.             {
  352.             for (i = 0; i * 2 < ntracks; i++)
  353.                 {
  354.                 strcpy(temp, "             |");
  355.                 temp += 14;
  356.                 }
  357.             *temp++ = '|';
  358.             for (i = 0; i * 2 < ntracks; i++)
  359.                 {
  360.                 strcpy(temp, "             |");
  361.                 temp += 14;
  362.                 }
  363.             }
  364.         }
  365.    else
  366.       last_result = 0;
  367.    return last_result;
  368.    }
  369.  
  370. void scroll()
  371.    {
  372.    if (run_in_fg() && last_result)
  373.         {
  374.       puts(scroll_buffer);
  375.         fflush(stdout);
  376.         }
  377.    }
  378.  
  379. void display_pattern(current, total, real)
  380. int current, total, real;
  381.    {
  382.    if (run_in_fg())
  383.         {
  384.           if (get_pref_scalar(PREF_XTERM))
  385.               {
  386.             if (get_pref_scalar(PREF_SHOW))
  387.                 {
  388.                 int i;
  389.                 for (i = 0; i < ntracks; i++)
  390.                     printf("--------------");
  391.                 printf("\033]2;tracker %s %3d/%3d[%3d] %s\007\n", VERSION,
  392.                     current, total, real, title);
  393.                 }
  394.             else
  395.                 {
  396.                 printf("\033]2;tracker %s %3d/%3d %s\007", VERSION,
  397.                     current, total, title);
  398.                 fflush(stdout);
  399.                 }
  400.               }
  401.         else
  402.               {
  403.             if (get_pref_scalar(PREF_SHOW))
  404.                 printf("\n%3d/%3d[%3d] %s\n", current, total, real, title);
  405.             else
  406.                 printf("%3d/%3d\b\b\b\b\b\b\b", current, total);
  407.             fflush(stdout);
  408.            }
  409.       }
  410.    current_pattern = current;
  411.    count_pattern = 0;
  412.    }
  413.  
  414. int checkbrk()
  415.    {
  416.    return FALSE;
  417.    }
  418.